home *** CD-ROM | disk | FTP | other *** search
/ PC-Blue - MS DOS Public Domain Library / PC-Blue MS-DOS Public Domain Library - NYACC.iso / vol045 / mx80.asm < prev    next >
Encoding:
Assembly Source File  |  1987-01-11  |  10.3 KB  |  243 lines

  1.  
  2. CAN'T LOCATE THAT FILE!
  3.  
  4. SIG/ACCESS: XA
  5. WHICH SECTION (  0 1 2 ): 1
  6. USING SECTION 1 DATABASE.
  7.  
  8. SIG/ACCESS: TYPE MX80.ASM
  9.         PAGE 0
  10.  
  11. ;       +-----------------------------------------+
  12. ;       |          MX-80 PRINTER DRIVER           |
  13. ;       |  GARY P. NOVOSIELSKI                    |
  14. ;       +-----------------------------------------+
  15. ;
  16. ;       SOME USEFUL EQUATES:
  17. ;
  18. CTRL    EQU     ' '-1           ;CONTROL KEY MASK
  19. NULL    EQU     CTRL AND '@'    ;SOME ASCII DEFINITIONS
  20. BS      EQU     CTRL AND 'H'    ;BACKSPACE
  21. HT      EQU     CTRL AND 'I'    ;HORIZONTAL TAB
  22. LF      EQU     CTRL AND 'J'    ;LINE FEED
  23. VT      EQU     CTRL AND 'K'    ;VERTICAL TAB
  24. FF      EQU     CTRL AND 'L'    ;FORM FEED
  25. CR      EQU     CTRL AND 'M'    ;CARRIAGE RETURN
  26. SO      EQU     CTRL AND 'N'    ;SHIFT OUT
  27. DC4     EQU     CTRL AND 'T'    ;DEVICE CONTROL 4
  28. ETB     EQU     CTRL AND 'W'    ;END OF TEXT BLOCK
  29. CAN     EQU     CTRL AND 'X'    ;CANCEL
  30. ESC     EQU     CTRL AND '['    ;ESCAPE
  31. DEL     EQU     7FH             ;DELETE
  32. ;
  33. ;INITIALIZATION STRING FOR PRINTER:
  34. INITS   DB      NULL OR 80H     ;MAKE SURE NO ESC SEQUENCE
  35.                                 ;IS IN PROGRESS.
  36.         DB      CAN             ;CANCEL ANYTHING IN BUFFER.
  37.         DB      ESC,'D'         ;START THE TABSET SEQUENCE.
  38.         DB      8,16,24,32,40,48,56,64,72,80
  39.         DB      88,96,104,112,120
  40.         DB      NULL            ;END THE SEQUENCE.
  41. PTRINIT DB      0               ;INITIALIZATION FLAG
  42. PESCF   DB      0               ;ESCAPE IN PROGRESS FLAG
  43. PTRCHAR DB      0               ;COLUMN COUNTER
  44. WIDEFLAG DB     0               ;DOUBLE WIDTH FLAG
  45. ;
  46. FALSE   EQU     0
  47. TRUE    EQU     NOT FALSE
  48. ;
  49. ;ENTRY TO THE SUBROUTINE IS MADE HERE:
  50. LPTOUT:         ;ON ENTRY, CHARACTER TO BE PRINTED IS IN
  51.                 ;REGISTER C.
  52. ;
  53.         LDA     PTRINIT         ;SEE IF INITIALIZATION
  54.         ORA     A               ;IS REQURED.
  55.         JNZ     INITD           ;JUMP IF NOT.
  56.         LXI     H,INITS         ;POINT TO THE INIT STRING.
  57. INITP   MOV     B,M             ;PUT THE CHAR IN B REGISTER
  58.         CALL    PROUT           ;FOR THE OUTPUT ROUTINE.
  59.         MOV     A,B             ;GET BACK THE CHARACTER.
  60.         INX     H               ;POINT TO NEXT CHARACTER.
  61.         ORA     A               ;IF WE JUST SENT A ZERO (NUL),
  62.                                 ;WE'RE DONE,
  63.         JNZ     INITP           ;ELSE DO SOME MORE.
  64.         DCR     A               ;PUTS  0FFH IN THE A REG.
  65.         STA     PTRINIT         ;STORE TRUE IN INIT FLAG
  66.                                 ;SO WE DON'T INITIALIZE EVERY
  67.                                 ;TIME.
  68. ;THE PRINTER HAS BEEN INITIALIZED.
  69. INITD   MOV     B,C             ;GET CHARACTER TO BE PRINTED
  70.                                 ;TO THE B REGISTER.
  71.         MOV     A,C             ;COPY TO A.
  72.         ANI     7FH             ;BUT ONLY LOW SEVEN BITS.
  73.         MOV     C,A             ;SAVE THE STRIPPED COPY IN C
  74.                                 ;FOR COMPARISONS LATER.
  75.         LDA     PESCF           ;SEE IF THE ESCAPE FLAG
  76.         ORA     A               ;IS TRUE, INDICATING
  77.         JNZ     PESCSP          ;WE ARE IN THE MIDDLE OF AN
  78.                                 ;ESCAPE SEQUENCE.
  79. ;ELSE THIS IS NOT AN ESCAPE SEQUENCE.  JUST A CHARACTER.
  80.         MOV     A,C             ;GET STRIPPED COPY TO A
  81.         CPI     DEL             ;IF ITS A DEL,
  82.         RZ                      ;IGNORE IT AND RETURN.
  83. ;
  84. ;
  85.         LXI     H,PTRCHAR       ;POINT TO THE CHARACTER COUNTER.
  86.                                 ;FOR LATER.
  87.         CPI     ' '             ;CHECK IF THIS IS A PRINTING
  88.         JNC     PRTCHAR         ;CHAR.  IF SO PRINT IT.
  89. ;THIS IS A CONTROL CHARACTER.  CHECK FOR SPECIAL CASES
  90.         CPI     BS              ;BACKSPACE CHAR?
  91.         JC      PROUT           ;ANYTHING LESS GOES OUT AS IS.
  92.         JZ      PBS             ;IF EQUAL, PROCESS BACKSPACE.
  93. ;
  94.         CPI     HT              ;TAB CHARACTER?
  95.         JZ      PPTAB           ;  IF SO, PROCESS IT.
  96. ;
  97.         CPI     SO              ;DOUBLE WIDTH SET COMMAND?
  98.         JC      NEWLINE         ;ANYTHING LESS MUST BE EITHER
  99.                                 ;LF, VT, FF, OR CR.  HANDLE IT.
  100.         JZ      SETWIDE         ;  IF EQUAL, SET THE FLAG.
  101. ;
  102.         CPI     DC4             ;DOUBLE WIDTH CLEAR COMMAND?
  103.         JZ      CLRWIDE         ;  IF SO, CLEAR THE FLAG.
  104. ;
  105.         CPI     ESC             ;ESCAPE CHARACTER?
  106.         JZ      PESCP           ;INITIATE ESCAPE SEQUENCE
  107.                                 ;PROCESSING.
  108. ;
  109.         CPI     ETB             ;SPECIAL CHARACTER ETB MEANS
  110.                                 ;DUMP THE BUFFER BUT DON'T
  111.                                 ;AFFECT PRINT POSITION.
  112.         JZ      PETBP
  113. ;
  114.         CPI     CAN             ;CANCEL MEANS ERASE THE BUFFER.
  115.                                 ;AND RESET COUNTER.
  116.         JNZ     PROUT           ;NONE OF THE ABOVE.  JUST SEND.
  117. NEWLINE:        ;A CHARACTER HAS BEEN RECEIVED WHICH
  118.                 ;RESETS THE COLUMN COUNT.
  119.         XRA     A               ;A CHEAP ZERO
  120.         MOV     M,A             ;TO THE COUNTER
  121.         STA     WIDEFLAG        ;AND THE DOUBLE WIDTH FLAG
  122.         JMP     PROUT           ;SEND WHATEVER IT WAS FROM
  123.                                 ;REGISTER B.
  124. ;
  125. PRTCHAR:        ;A NORMAL PRINTING CHARACTER OR SPACE
  126.                 ;IS GOING OUT.
  127.         INR     M               ;INCREMENT COLUMN COUNT
  128. ;
  129.         LDA     WIDEFLAG        ;IF DOUBLE WIDTH
  130.         ORA     A               ;  IS OFF
  131.         JZ      PROUT           ;  PRINT IT.
  132. ;
  133.         INR     M               ;ELSE INCREMENT A SECOND TIME
  134.                                 ;  FOR DOUBLE WIDTH.
  135.         JMP     PROUT           ;  AND THEN PRINT IT.
  136. ;
  137. PPTAB:  ;PROCESS A TAB CHARACTER
  138.         LDA     WIDEFLAG        ;IF DOUBLE WIDTH
  139.         ORA     A               ;  IS ON
  140.         JNZ     PROUT           ;  TAB CHARACTERS ARE IGNORED
  141.                                 ;  FOR SOME UNKNOWN REASON.
  142. ;
  143.         MOV     A,M             ;ELSE GET THE OLD COLUMN COUNT,
  144.         ADI     8               ;  ADJUST TO NEXT
  145.         ANI     NOT 7           ;  TAB STOP
  146.         MOV     M,A             ;  AND UPDATE THE COUNT.
  147.         JMP     PROUT           ;SEND HT CHAR TO PRINTER.
  148. ;
  149. PESCP:          ;AN ESCAPE CHARACTER HAS BEEN RECEIVED
  150.                 ;MAKE A NOTE THAT A SEQUENCE IS IN PROGRESS.
  151.         MVI     A,TRUE          ;PUT ALL ONES
  152.         STA     PESCF           ;  IN THE ESCAPE FLAG
  153. ;
  154.         JMP     PROUT           ;SEND ESC TO PRINTER.
  155. PESCSP:
  156. ;       PROCESS THE NEXT CHARACTER OF AN ESCAPE SEQUENCE.
  157.         CPI     TRUE            ;IF THE ESCAPE FLAG IS ALL
  158.                                 ;  ONES, WE JUST BEGAN,
  159.                                 ;  SO THIS MUST BE THE
  160.         JZ      SECOND          ;  SECOND BYTE.
  161.         ;ELSE THIS IS THE THIRD BYTE OR MORE
  162. THIRD   CPI     'A'             ;IF THIS IS AN ESC A SEQUENCE
  163.         JZ      LAST            ; OR
  164.         CPI     'C'             ; AN ESC C SEQUENCE,
  165.         JZ      LAST            ; THE THIRD BYTE IS THE LAST.
  166.         ;ELSE THIS SEQUENCE TERMINATES WITH A NUL.
  167.         MOV     A,C             ;SEE IF THIS BYTE
  168.         ORA     A               ;  IS A NUL.
  169.         JNZ     PROUT           ;IF NOT WE'RE STILL WITHIN THE
  170.                                 ;SEQUENCE.
  171. LAST    XRA     A               ;LAST ONE. END THE SEQUENCE
  172.                                 ;  BY...
  173. NEXT    STA     PESCF           ;  ...UPDATING THE FLAG.
  174.         JMP     PROUT           ;SEND THE BYTE TO THE PRINTER
  175. SECOND:
  176. ;SECOND CHAR OF ESC SEQUENCE.  SEE WHAT THE ID CHARACTER IS:
  177.         CPI     'A'             ;A THRU D ARE 3 OR MORE BYTES
  178.         JC      LAST            ;  OTHERS ARE JUST TWO
  179.         CPI     'E'             ;  SO WE DON'T SAVE ANYTHING
  180.         JNC     LAST            ;  JUST PUT THEM OUT.
  181.                                 ;FOR THE LONG ONES, WE SAVE THE
  182.         JMP     NEXT            ;ID CHARACTER BY...
  183. ;
  184. SETWIDE:        ;A CTRL-N HAS BEEN RECEIVED.
  185.         STA     WIDEFLAG                ;SET THE SOFTWARE FLAG
  186.         JMP     PROUT                   ;  AND THE HARDWARE ONE.
  187. ;
  188. CLRWIDE:        ;A CTRL-T HAS BEEN RECEIVED.
  189.         XRA     A                       ;CLEAR
  190.         STA     WIDEFLAG                ;  THE SOFTWARE
  191.         JMP     PROUT                   ;  AND HARDWARE FLAGS.
  192. PBS:    ;PROCESS A BACKSPACE CHARACTER
  193.         XRA     A               ;CLEAR THE
  194.         STA     WIDEFLAG        ;DOUBLE WIDTH FLAG.
  195.         MOV     A,M             ;GET THE COLUMN COUNTER.
  196.         ORA     A               ;IF AT LEFT MARGIN, NO EFFECT.
  197.         RZ                      ;  SO FORGET IT.
  198.                                 ;ELSE
  199.         MOV     D,M             ;SAVE COUNT IN D
  200.         DCR     M               ;BACKSPACE THE COUNT.
  201.         MVI     B,CR            ;PRINT THE LINE SO FAR BY SEND-
  202.                                 ;  ING A CARRIAGE RETURN
  203.         CALL    PROUT           ;  TO THE PRINTER.
  204.                                 ;NOW GET READY TO SEND SOME
  205.         MVI     B,' '           ;  SPACES.
  206. PBS1:           ;SPACE OVER TO WHERE WE BELONG.
  207.         DCR     D               ;DONE YET?
  208.         RZ                      ;  LEAVE IF SO
  209.         CALL    PROUT           ;ELSE PUT OUT A SPACE.
  210.         JMP     PBS1            ;  UNTIL WE GET BACK TO WHERE
  211.                                 ;  WE ONCE BELONGED.
  212. ;
  213. PETBP:  ;HANDLE THE ETB CHARACTER. DONE SAME AS BS
  214.         ;EXCEPT ONE MORE SPACE IS SENT.
  215.         INR     M               ;ONE MORE SPACE
  216.         JMP     PBS             ;GO TO IT
  217. ;
  218. PROUT   EQU     $
  219.         ;THE PROUT ROUTINE MUST SEND THE CHARACTER
  220.         ;IN THE B REGISTER TO THE PRINTER, AND
  221.         ;RETURN ALL REGISTERS IN THEIR ORIGINAL
  222.         ;CONDITION, EXCEPT FOR A AND FLAGS.
  223.         ;
  224.         ;THE FOLLOWING IS AN EXAMPLE.  THE LINES
  225.         ;BEGINNING WITH A "U" CONTAIN UNDEFINED PORT
  226.         ;VALUES WHICH DEPEND ON THE USER'S INDIVIDUAL
  227.         ;HARDWARE.
  228.         ;
  229.         IN      STATUSPORT
  230.         ANI     BUSYMASK
  231.         JNZ     PROUT           ;MAKE IT "JZ" IF THE FLAG
  232.                                 ;BIT IS A "READY" 
  233.                                 ;RATHER THAN A "BUSY".
  234.         MOV     A,B
  235.         OUT     DATAPORT
  236.         RET
  237.         ;
  238. ;
  239.         END
  240.  
  241.  
  242. SIG/ACCESS: ;RATHER THAN A "BUSY".
  243.